#include "ServerChecker.h"

#include <stdexcept>
#include <gtkmm/menuitem.h>

#include "Socket.h"


ServerChecker::ServerChecker(Glib::RefPtr<Gtk::Builder> b, std::string nomMenu, std::string nomStat,
	Configuraciones** cfg)
{
	// Obtiene el menuItem y la estatus bar
	this->_sb = 0;
	Gtk::MenuItem* mi = 0;
	b->get_widget(nomMenu, mi);
	b->get_widget(nomStat, this->_sb);

	if (!mi) throw std::runtime_error("Error, no se encontró '"+ nomMenu);
	if (!this->_sb) throw std::runtime_error("Error, no se encontró '"+ nomStat);

	// Conecto la signal al menuItem
	mi->signal_activate().connect( sigc::mem_fun(*this, &ServerChecker::checkEstadoServer) );

	// Guardo la configuracion 
	this->_ppConfig = cfg;
}


ServerChecker::~ServerChecker(){
}

				
void ServerChecker::checkEstadoServer(){

	// Si todavia no esta cargada la configuracion no se puede chequear el server
	if ( *this->_ppConfig == NULL ){
		this->_sb->push("No hay archivo de configuraciones cargado");
		return;
	}

	try {
		ClientSocket cs("127.0.0.1", (*this->_ppConfig)->nroPuertoCtrl);

		char v = 'V';
		cs.send(static_cast<void*>(&v), sizeof(v));
		cs.recv(static_cast<void*>(&v), sizeof(v));

		// Si lo que se envio es lo mismo que se recibio en servidor esta corriendo
		if ('V' == v)
			this->_sb->push("Servidor: On");
		else
			this->_sb->push("Servidor: Error no definido");

	} catch (SocketException& sex){
		// Si fallo la conexion el server no esta corriendo
		this->_sb->push("Servidor: Off");
	}
}


